/*
 * mapa.h
 *
 *  Created on: 21/07/2014
 *      Author: migue
 */

#ifndef MAPA_H_
#define MAPA_H_

#include <sys/socket.h>
#include "servidor_rpc.h"

/**********************************************************************
 * Nodo para manejar entidades menos personas
 **********************************************************************/

#define BROKER_ACTIVO 1
#define BROKER_MUERTO 0

struct DATOS_NODO {
	int id;
	DireccionHost ip;

	int idBrokerConectado;
	int puerto;
	int timeout_anillo;
	int estadoBroker;
	TipoEntidad tipo;
};

typedef struct DATOS_NODO DATOS_NODO;

struct NODO;

struct NODO {
	int id;
	DATOS_NODO* dato;
	struct NODO *_izquierda, *_derecha;
};

typedef struct NODO NODO;


/**********************************************************************
 * Estructura para manejar exclusivamente personas
 **********************************************************************/
struct NODO_PERSONA;

struct NODO_PERSONA {
	int id_remoto;
	DireccionHost ip;
	DATOS_NODO* datos;

	struct NODO_PERSONA* _izq;
	struct NODO_PERSONA* _der;
	struct NODO_PERSONA* _abajo;
};

typedef struct NODO_PERSONA NODO_PERSONA;

struct NODO_BROKER;
struct NODO_BROKER {
	int id;
	DATOS_NODO* datos;

	struct NODO_BROKER* _anterior;
	struct NODO_BROKER* _siguiente;
};

typedef struct NODO_BROKER NODO_BROKER;
/********************************************************************/



#define DELTA_TIMEOUT		5
#define TIMEOUT_INICIAL		5

struct MAPA_DATOS {
	int _cantBrokers;
//	int _ultBrokerUsado;
	int _ultimoTimeout;

	int _cantBusReemp;

	int _cantPersonas;
	NODO* _raiz;
	NODO_PERSONA* _raizPersona;

	NODO_BROKER* _ultBroker;
};

typedef struct MAPA_DATOS MAPA_DATOS;

MAPA_DATOS* inicializarMapa();
DATOS_NODO* buscarNodo(MAPA_DATOS* mapa, int id);
void insertarNodo(MAPA_DATOS* mapa, DATOS_NODO* datos);
void eliminarMapa(MAPA_DATOS* mapa);


DATOS_NODO* crearNodoDatos();
void eliminarNodoDatos(DATOS_NODO* datos);

NODO* crearNodo(DATOS_NODO* datos);
void eliminarNodo(MAPA_DATOS* mapa, int id);

/********************************************************************
 * Funciones para manejar personas
 ********************************************************************/

DATOS_NODO* buscarPersona(MAPA_DATOS* mapa, int idRemoto, DireccionHost* ip);
void insertarPersona(MAPA_DATOS* mapa, DATOS_NODO* datosPersona, int idRemoto);

NODO_PERSONA* crearNodoPersona(DATOS_NODO* datos, int idRemoto);


/********************************************************************/

NODO_BROKER* crearNodoBroker(DATOS_NODO* datos);

void agregarNodoBroker(MAPA_DATOS* mapa, NODO_BROKER* nodo);

void pasarSiguienteBroker(MAPA_DATOS *mapa);

void inhabilitarBroker(MAPA_DATOS* mapa, int idBroker);

void rehabilitarBroker(DATOS_NODO* datosBroker, DatosEntidad* ent);

/********************************************************************/

void copiarDireccion(DireccionHost* dest, DireccionHost* orig, unsigned tam);

void imprimirMapa(MAPA_DATOS* mapa);

#endif /* MAPA_H_ */
